package com.cod.render.shapes;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.opengles.GL10;

public class Square {

	/**
	 * Die Vektoren
	 */
	private float vertices[];

	/**
	 * Die Indizen (Die Reihenfolge, in den wir die Vektoren verbinden)
	 */
	private short[] indices = { 0, 1, 2, 0, 2, 3 };

	/**
	 * Der Vektor-Buffer
	 */
	private FloatBuffer vertexBuffer;

	/**
	 * Der Index-Buffer
	 */
	private ShortBuffer indexBuffer;

	public Square(float Pvertices[]) {
		this.vertices = Pvertices;
		// ein Float verbraucht 4 Bytes, somit brauchen wir 4*Anzahl Vektoren
		ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
		vbb.order(ByteOrder.nativeOrder());
		vertexBuffer = vbb.asFloatBuffer();
		vertexBuffer.put(vertices);
		vertexBuffer.position(0);

		// ein Short verbraucht 2 Bytes
		ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
		ibb.order(ByteOrder.nativeOrder());
		indexBuffer = ibb.asShortBuffer();
		indexBuffer.put(indices);
		indexBuffer.position(0);
	}

	/**
	 * Rechteck zeichnen
	 * 
	 * @param gl
	 */
	public void draw(GL10 gl) {
		// Culling gegen den Uhrzeigersinn einstellen
		gl.glFrontFace(GL10.GL_CCW);
		// Culling aktivieren
		gl.glEnable(GL10.GL_CULL_FACE);
		// Die hinteren Polygone nicht zeichnen
		gl.glCullFace(GL10.GL_BACK);

		// Vektoren einschalten
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		// Auf den Vektor-Buffer zeigen
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
		// Zeichnen
		gl.glDrawElements(GL10.GL_TRIANGLES, 6,
				GL10.GL_UNSIGNED_SHORT, indexBuffer);

		// Vektoren ausschalten
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		// Culling ausschalten
		gl.glDisable(GL10.GL_CULL_FACE);
	}

}
